﻿#region Using

using System;
using System.Collections.Generic;
using System.Linq;
using Vk.Methods.Common;

#endregion

namespace Vk.Methods.Wall
{
    /// <summary>
    ///     Объект post, описывающий запись на стене пользователя или сообщества
    /// </summary>
    public class WallPost : BaseEntity
    {
        /// <summary>
        ///     Информация о вложениях записи
        /// </summary>
        public List<WallAttachment> Attachments { get; set; }

        /// <summary>
        ///     Текст записи
        /// </summary>
        public string Body { get; set; }

        /// <summary>
        ///     Информация о том, может ли текущий пользователь удалить запись (true — может, false — не может).
        /// </summary>
        public bool? CanDelete { get; set; }

        /// <summary>
        ///     Информация о том, может ли текущий пользователь редактировать запись (true — может, false — не может).
        /// </summary>
        public bool? CanEdit { get; set; }

        /// <summary>
        ///     Информация о том, может ли текущий пользователь закрепить запись (true — может, false — не может).
        /// </summary>
        public bool? CanPin { get; set; }

        /// <summary>
        ///     Информация о комментариях к записи
        /// </summary>
        public CommentsInfo CommentsInfo { get; set; }

        /// <summary>
        ///     Массив, содержащий историю репостов для записи. Возвращается только в том случае, если запись является репостом.
        ///     Каждый из объектов массива, в свою очередь, является объектом-записью стандартного формата.
        /// </summary>
        public List<WallPost> CopyHistory { get; set; }

        /// <summary>
        ///     Время публикации записи
        /// </summary>
        public DateTime? Date { get; set; }

        /// <summary>
        ///     Только для друзей
        /// </summary>
        public bool? FriendsOnly { get; set; }

        /// <summary>
        ///     Идентификатор автора записи.
        /// </summary>
        public int? FromUser { get; set; }

        /// <summary>
        ///     Информация о местоположении
        /// </summary>
        public GeoInfo GeoInfo { get; set; }

        /// <summary>
        ///     Информация о том, закреплена ли запись (true — закреплена, false — не закреплена).
        /// </summary>
        public bool? IsPinned { get; set; }

        /// <summary>
        ///     Информация о лайках к записи
        /// </summary>
        public LikesInfo LikesInfo { get; set; }

        /// <summary>
        ///     Информация о способе размещения записи
        /// </summary>
        public PostSource PostSource { get; set; }

        /// <summary>
        ///     Идентификатор записи, в ответ на которую была оставлена текущая.
        /// </summary>
        public int? ReplyId { get; set; }

        /// <summary>
        ///     Идентификатор владельца записи, в ответ на которую была оставлена текущая.
        /// </summary>
        public int? ReplyOwnerId { get; set; }

        /// <summary>
        ///     Информация о репостах записи
        /// </summary>
        public RepostsInfo RepostsInfo { get; set; }

        /// <summary>
        ///     Идентификатор автора, если запись была опубликована от имени сообщества и подписана пользователем{ get; set; }
        /// </summary>
        public int? SignerId { get; set; }

        /// <summary>
        ///     Идентификатор владельца стены, на которой размещена запись.
        /// </summary>
        public int? ToUser { get; set; }

        /// <summary>
        ///     Тип
        /// </summary>
        public WallEntityType? Type { get; set; }

        public WallPost(ApiNode node)
        {
            Id = node.Int("id");
            OwnerId = node.Int("owner_id");
            FromUser = node.Int("from_id");
            Date = node.DateTime("date");
            Body = node.String("text");

            ReplyOwnerId = node.Int("reply_owner_id");
            ReplyId = node.Int("reply_post_id");
            FriendsOnly = node.Bool("friends_only");
            CommentsInfo = node.Object("comments", x => new CommentsInfo(x));
            LikesInfo = node.Object("likes", x => new LikesInfo(x));
            RepostsInfo = node.Object("reposts", x => new RepostsInfo(x));

            Type = node.Enum<WallEntityType>("post_type");
            PostSource = node.Object("post_source", x => new PostSource(x));

            var attachmentsNode = node.SelectNode("attachments");
            if (attachmentsNode != null)
            {
                Attachments = attachmentsNode.ChildNodes.Select(x => new WallAttachment(x)).ToList();
            }

            GeoInfo = node.Object("geo", x => new GeoInfo(x));

            var historyNode = node.SelectNode("copy_history");
            if (historyNode != null)
            {
                CopyHistory = historyNode.ChildNodes.Select(x => new WallPost(x)).ToList();
            }

            SignerId = node.Int("signer_id");
            CanPin = node.Bool("can_pin");
            CanDelete = node.Bool("can_delete");
            CanEdit = node.Bool("can_edit");
            IsPinned = node.Bool("is_pinned");
        }
    }
}